package com.zyl.renamepdf.util;

import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PdfReader {
    private static final Logger logger = LoggerFactory.getLogger(PdfReader.class.getSimpleName());


    protected static final String BASE_FILE_PATH = System.getProperty("user.dir") + File.separator + "needHandleFiles";
    protected static final String NEW_FILE_PATH = System.getProperty("user.dir") + File.separator + "result";

    /**
     * 固定字符串
     */
    protected static final String STR = "4 B/L(AWB)번호 5 화물관리번호 8 반입일 9 징수형태";

    public static void execute() {
        logger.error(BASE_FILE_PATH);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String ymd = dateFormat.format(new Date());
        File pendingFolder = new File(BASE_FILE_PATH + File.separator + ymd);
        if (!pendingFolder.exists()) {
            logger.error("基本文件目录不存在！");
            return;
        }
        if (!pendingFolder.isDirectory()) {
            logger.error("基本文件目录不是一个文件夹！");
            return;
        }
        File[] pendingFiles = pendingFolder.listFiles();
        if (pendingFiles == null) {
            logger.error("没有待处理的文件！");
            return;
        }
        for (File pdfFile : pendingFiles) {
            if (pdfFile.isFile()) {
                // 获取文件名称
                String pdfName = pdfFile.getName();
                // 获取pdf内容
                String content = readPdfContent(pdfFile);
                // 提取需要的信息
                String newFileName = extractFileName(content);
                if (StringUtils.isEmpty(newFileName)) {
                    newFileName = pdfName;
                }
                // 拷贝文件到另一个文件夹下 并重命名
                copyFileToNewFolder(pdfFile, newFileName, ymd);
            }
        }
        logger.error("处理完成！");
    }

    /**
     * 拷贝文件到新目录，并重命名
     *
     * @param pdfFile     被拷贝的文件
     * @param newFileName 新文件名
     * @param ymd         日期文件夹名称
     */
    private static void copyFileToNewFolder(File pdfFile, String newFileName, String ymd) {
        String basePath = NEW_FILE_PATH + File.separator + ymd;
        File baseFolder = new File(basePath);
        if (!baseFolder.exists()) {
            baseFolder.mkdirs();
        }
        try {
            FileUtils.copyFile(pdfFile, new File(basePath + File.separator + newFileName));
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("拷贝文件到新目录下发生异常！{}", e.getLocalizedMessage());
        }
    }

    /**
     * 提取需要的信息
     *
     * @param content pdf全部内容
     * @return 需要的信息
     */
    private static String extractFileName(String content) {
        if (StringUtils.isNotEmpty(content) && content.contains(STR)) {
            String[] split = content.split("\r\n");
            for (int i = 0; i < split.length; i++) {
                String s = split[i];
                if (STR.equals(s) && i + 1 < split.length) {
                    String mainContent = split[i + 1];
                    if (mainContent.length() > 12) {
                        return mainContent.substring(0, 12) + ".pdf";
                    }
                }
            }
        }
        return null;
    }

    public static String readPdfContent(File file) {
        PDDocument document = null;
        String text = "";
        try {
            document = PDDocument.load(file);
            PDFTextStripper pdfStripper = new PDFTextStripper();
            text = pdfStripper.getText(document);
//            logger.error("PDF Contents: {}", text);
            return text;
        } catch (IOException e) {
            e.printStackTrace();
            return text;
        } finally {
            if (document != null) {
                try {
                    document.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}